问题
先来看一个反例:
try{ int i = 0; while(true){ range[i++].climb(); } } catch (ArrayIndexOutOfBoundsException){ }
在上面这个企图利用数组越界的异常从而跳出死循环。如果针对的是数组遍历的场景,这么做的目的是企图利用Java异常机制,来跳过遍历中每次都需要检查是否越界来达到性能优化。但是,这种用法显然是不合理的,那么,对异常的使用应该注意哪些问题?
答案
- 异常应该只用于异常处理的情况,永远不应该应用到控制流中, 例如,上面的反例;
- 异常机制的设计初衷是用于不正常的情形,所以JVM实现不会对其优化,所以企图用异常来达到性能优化,是不可行的;
- 把代码放在try-catch块中反而阻止了现代JVM可能会执行的一些优化操作;
- 针对上例,对数组标准的遍历模式并不会导致冗余的检查,JVM会对其进行优化;
结论
在使用异常的时候,应该坚持异常只应该被当做异常来处理,而不应该企图利用异常来达到性能优化的目的。